﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace getMD5
{
    public partial class Form_MD5 : Form
    {
        public Form_MD5()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            textBox1.Text = MD5.Encrypt(textBox1.Text, 32);
        }

        private void Form_DragEnter(object sender, DragEventArgs e)
        {
            dragEnter(e);
        }

        private void Form_DragDrop(object sender, DragEventArgs e)
        {
            TextBox textBox = sender as TextBox;
            textBox.Text = dragDrop(e);                 // 获取拖入的文件
            string[] files = textBox.Text.Split(';');

            string tmp = getFilesMD5(files);            // 计算文件MD5值
            textBox1.Text = tmp;
            SaveProcess(tmp, "MD5.txt");
        }


        // 计算各文件对应的MD5值
        public static String getFilesMD5(string[] files)
        {
            string tmp = "";

            foreach (string file in files)
            {
                if (System.IO.File.Exists(file))
                {
                    string data = fileToString(file);
                    string md5 = MD5.Encrypt(data, 32);
                    tmp += "\r\n" + file + "(" + md5 + ")";
                }
            }

            return tmp;
        }

        #region 文件读取与保存

        /// <summary>  
        /// 获取文件中的数据串  
        /// </summary>  
        public static string fileToString(String filePath)
        {
            string str = "";

            //获取文件内容  
            if (System.IO.File.Exists(filePath))
            {
                System.IO.StreamReader file1 = new System.IO.StreamReader(filePath, Encoding.Default);//读取文件中的数据  
                str = file1.ReadToEnd();                                            //读取文件中的全部数据  

                file1.Close();
                file1.Dispose();
            }
            return str;
        }

        /// <summary>
        /// 保存数据data到文件处理过程，返回值为保存的文件名
        /// </summary>  
        public static String SaveProcess(String data, String name = "", String CurDir = "")
        {
            if (CurDir.Equals("")) CurDir = System.AppDomain.CurrentDomain.BaseDirectory;           //设置当前目录  
            if (name.Equals("")) name = "MD5.txt";
            if (!System.IO.Directory.Exists(CurDir)) System.IO.Directory.CreateDirectory(CurDir);   //该路径不存在时，在当前文件目录下创建文件夹"导出.."  

            //不存在该文件时先创建  
            String filePath = CurDir + name;
            System.IO.StreamWriter file1 = new System.IO.StreamWriter(filePath, false);     //文件已覆盖方式添加内容  

            file1.Write(data);                                                              //保存数据到文件  

            file1.Close();                                                                  //关闭文件  
            file1.Dispose();                                                                //释放对象  

            return filePath;
        }

        #endregion


        # region 文件拖拽

        /// <summary>  
        /// 文件拖进事件处理：  
        /// </summary>  
        public void dragEnter(DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop))    //判断拖来的是否是文件  
                e.Effect = DragDropEffects.Link;                //是则将拖动源中的数据连接到控件  
            else e.Effect = DragDropEffects.None;
        }

        /// <summary>  
        /// 文件放下事件处理：  
        /// 放下, 另外需设置对应控件的 AllowDrop = true;   
        /// 获取的文件名形如 "d:\1.txt;d:\2.txt"  
        /// </summary>  
        public string dragDrop(DragEventArgs e)
        {
            Array file = (System.Array)e.Data.GetData(DataFormats.FileDrop);//将拖来的数据转化为数组存储
            return toSubDirFileNames(file);
        }

        // 获取所有files目录下的所有文件，转化为单个串
        public static string toSubDirFileNames(Array files)
        {
            StringBuilder filesName = new StringBuilder("");

            foreach (object I in files)
            {
                string str = I.ToString();

                System.IO.FileInfo info = new System.IO.FileInfo(str);
                //若为目录，则获取目录下所有子文件名  
                if ((info.Attributes & System.IO.FileAttributes.Directory) != 0)
                {
                    str = getAllFiles(str);
                    if (!str.Equals("")) filesName.Append((filesName.Length == 0 ? "" : ";") + str);
                }
                //若为文件，则获取文件名  
                else if (System.IO.File.Exists(str))
                    filesName.Append((filesName.Length == 0 ? "" : ";") + str);
            }

            return filesName.ToString();
        }

        /// <summary>  
        /// 判断path是否为目录  
        /// </summary>  
        public bool IsDirectory(String path)
        {
            System.IO.FileInfo info = new System.IO.FileInfo(path);
            return (info.Attributes & System.IO.FileAttributes.Directory) != 0;
        }

        /// <summary>  
        /// 获取目录path下所有子文件名  
        /// </summary>  
        public static string getAllFiles(String path)
        {
            StringBuilder str = new StringBuilder("");
            if (System.IO.Directory.Exists(path))
            {
                //所有子文件名  
                string[] files = System.IO.Directory.GetFiles(path);
                foreach (string file in files)
                    str.Append((str.Length == 0 ? "" : ";") + file);

                //所有子目录名  
                string[] Dirs = System.IO.Directory.GetDirectories(path);
                foreach (string dir in Dirs)
                {
                    string tmp = getAllFiles(dir);  //子目录下所有子文件名  
                    if (!tmp.Equals("")) str.Append((str.Length == 0 ? "" : ";") + tmp);
                }
            }
            return str.ToString();
        }

        # endregion

    }
}
